﻿using System;
using System.Collections.Generic;
using System.Data;
using System.Linq;
using Viettel.VOFFICE.DAO.DAL.Paging;
using Viettel.VOFFICE.DAO.Models;

namespace Viettel.VOFFICE.DAO.DAL.Repository
{
    /// <summary>
    /// xử lý sổ công văn
    /// </summary>
    public class BookRepository : IRepository<Book>
    {
        private VOFFICEContext context;
        public BookRepository(VOFFICEContext context)
        {
            if (context == null)
            {
                throw new Exception("Context must be init");
            }
            this.context = context;
        }

        /// <summary>
        /// lấy toàn bộ sổ văn bản từ database
        /// </summary>
        /// <returns></returns>
        public IEnumerable<Book> Get()
        {
            return context.Books.OrderByDescending(o => o.UpdatedAt).Select(o => o);
        }

        /// <summary>
        /// lấy sổ văn bản từ db với thông tin phân trang
        /// </summary>
        /// <param name="pageIndex"></param>
        /// <param name="pageSize"></param>
        /// <returns></returns>
        public PagedList<Book> GetWithPaging(int pageIndex, int pageSize)
        {
            return context.Books.OrderByDescending(o => o.UpdatedAt).Paginate(pageIndex, pageSize);
        }

        /// <summary>
        /// tìm một sổ văn bản bởi Id của sổ trong db
        /// </summary>
        /// <param name="id"></param>
        /// <returns></returns>
        public Book GetById(object id)
        {
            return context.Books.Find(int.Parse(id.ToString()));
        }

        public IEnumerable<Book> FindByName(object s)
        {
            throw new NotImplementedException();
        }

        /// <summary>
        /// thêm mới sổ văn bản vào db
        /// </summary>
        /// <param name="T"></param>
        public void Insert(Book T)
        {
            context.Books.Add(T);
            Save();
        }

        /// <summary>
        /// xóa sổ văn bản từ db
        /// </summary>
        /// <param name="id"></param>
        public void Delete(object id)
        {
            var item = GetById(id);
            if (item != null)
            {
                context.Books.Attach(item);
                context.Books.Remove(item);
                Save();
            }
        }

        /// <summary>
        /// xóa sổ văn bản từ db
        /// </summary>
        /// <param name="T"></param>
        public void Delete(Book T)
        {
            if (null != T)
            {
                context.Books.Attach(T);
                context.Books.Remove(T);
                Save();
            }
        }

        /// <summary>
        /// Cập nhập sổ văn bản
        /// </summary>
        /// <param name="T"></param>
        public void Update(Book T)
        {
            context.Entry(T).State = EntityState.Modified;
            Save();
        }

        /// <summary>
        /// Tìm kiếm theo tên sổ văn bản
        /// </summary>
        /// <param name="key"></param>
        /// <returns></returns>
        public IEnumerable<Book> Search(string key)
        {
            return context.Books.Where(o => o.Name.Contains(key)).OrderByDescending(o => o.UpdatedAt);
        }

        public void Save()
        {
            context.SaveChanges();
        }

        /// <summary>
        /// Lấy ra toàn bộ sổ văn bản đang hoạt động hoặc không hoạt động
        /// </summary>
        /// <param name="isActive"></param>
        /// <returns></returns>
        public IEnumerable<Book> GetAllActive(bool isActive = true)
        {
            if (isActive == true)
            {
                return context.Books.Where(o => o.IsActive == isActive).OrderByDescending(o => o.UpdatedAt).Select(o => o);
            }
            else
            {
                return
                    context.Books.Where(o => o.IsActive == null || o.IsActive == isActive).OrderByDescending(
                        o => o.UpdatedAt).Select(o => o);
            }
        }

        /// <summary>
        /// Lấy ra sổ văn bản bởi loại sổ và phòng ban
        /// </summary>
        /// <param name="bookType"></param>
        /// <param name="deptId"></param>
        /// <param name="isActive"></param>
        /// <returns></returns>
        public IEnumerable<Book> GetByBookTypeAndDept(Enums.BookType bookType, int? deptId, bool isActive = true)
        {
            return context.Books.Where(
                                        o => o.IsActive == isActive
                                        && o.BookType == (int)bookType
                                        && (o.v_Department.Id == deptId || o.IsCommon == true)
                                    ).OrderByDescending(o => o.IsDefault);
        }
    }
}
